package com.ssy.lingxi.contract.esign.request;

import lombok.Builder;
import lombok.Data;

import java.util.List;

@Builder
@Data
public class SignFlowCreateOneStepRequest {

    /**
     * 必填: 否
     * 附件信息
     */
    private List<Attachment> attachments;
    /**
     * 必填: 否
     * 抄送人人列表
     */
    private List<Copier> copiers;
    /**
     * 必填: 是
     * 待签文档信息，请把要签署的文档全部都通过该参数设置上
     */
    private List<Doc> docs;
    /**
     * 必填: 是
     * 流程基本信息
     */
    private FlowInfoBean flowInfo;
    /**
     * 必填: 是
     * 签署方信息
     */
    private List<Signer> signers;

    @Data
    public static class Attachment {
        /**
         * 必填: 是
         * 附件Id
         */
        private String fileId;
        /**
         * 必填: 是
         * 附件名称
         */
        private String attachmentName;
    }

    @Data
    public static class Copier {

        /**
         * 必填: 是
         * 参与人account id
         */
        private String copierAccountId;
        /**
         * 必填: 是
         * 参与主体账号id
         */
        private String copierIdentityAccountId;

        /**
         * 必填: 否
         * 参与主体类型, 0-个人, 1-企业, 默认个人
         */
        private Integer copierIdentityAccountType;
    }

    @Data
    public static class Doc {
        /**
         * 必填: 是
         * 文档id
         */
        private String fileId;
        /**
         * 必填: 否
         * 文件名称（必须带上文件扩展名，不然会导致后续发起流程校验过不去 示例：合同.pdf ）；
         * 注意：该字段的文件后缀名称和真实的文件后缀需要一致。比如上传的文件类型是word文件，那该参数需要传“xxx.docx”，不能是“xxx.pdf”
         */
        private String fileName;
        /**
         * 必填: 否
         * 是否加密，0-不加密，1-加密，默认0
         * 注意：只支持编辑加密的PDF文档，且签署区设置的时候只有平台自动签署和签署方自动签署场景支持对加密文件盖章，手动签署区不支持
         */
        private Integer encryption;
        /**
         * 必填: 否
         * 文档密码, 如果encryption值为1, 文档密码不能为空，默认没有密码
         */
        private String filePassword;
    }


    @Data
    public static class FlowInfoBean {
        /**
         * 必填: 否
         * 是否自动归档，默认false
         */
        private Boolean autoArchive;
        /**
         * 必填: 否
         * 是否自动开启，默认false。
         */
        private Boolean autoInitiate;
        /**
         * 必填: 是
         * 文件主题
         */
        private String businessScene;
        /**
         * 必填: 否
         * 文件到期前，提前多少小时回调提醒续签，小时（时间区间：1小时——15天），默认不提醒
         */
        private Integer contractRemind;
        /**
         * 必填: 否
         * 文件有效截止日期，时间戳格式，毫秒，默认不失效
         */
        private Long contractValidity;
        /**
         * 必填: 否
         * 任务配置信息
         */
        private FlowConfigInfo flowConfigInfo;
        /**
         * 必填: 否
         * 流程备注
         */
        private String remark;

        /**
         * 必填: 否
         * 发起方账户id
         */
        private String initiatorAccountId;

        /**
         * 必填: 否
         * 发起方主体id
         */
        private String initiatorAuthorizedAccountId;

        /**
         * 必填: 否
         * 签署有效截止时间，时间戳格式，毫秒，默认不失效
         * 注：超过签署有效截止时间，则无法继续签署。
         */
        private Long signValidity;

        @Data
        public static class FlowConfigInfo {
            /**
             * 必填: 否
             * 通知开发者地址。
             * e签宝服务器主动通知客户服务器里指定的http/https路径
             */
            private String noticeDeveloperUrl;
            /**
             * 必填: 否
             * 通知方式，可选择多种通知方式，逗号分割，1-短信，2-邮件。 默认1
             * 注：短信或者邮件获取到的签署链接，有效期默认30天
             */
            private String noticeType;
            /**
             * 必填: 否
             * 签署完成重定向地址。
             * 地址需要携带http/https 协议。
             */
            private String redirectUrl;
            /**
             * 必填: 否
             * 签署平台，可选择多种签署平台，逗号分割，1-开放服务h5，2-支付宝签 ，默认值1，2
             */
            private String signPlatform;
            /**
             * 必填: 否
             * 签署完成重定向跳转延迟时间，默认3。
             * 0-不展示签署完成结果页，签署完成直接跳转重定向地址
             * 3-展示签署完成结果页，倒计时3秒后，自动跳转重定向地址
             * 注：当redirectUrl不传的情况下，该字段无需传入，默认签署完成结果页不跳转
             */
            private String redirectDelayTime;
        }
    }

    @Data
    public static class Signer {

        /**
         * 必填: 否
         * 是否平台自动签署，默认false
         * false-为对接平台的用户签署
         * true-平台方自动签署
         */
        private Boolean platformSign;
        /**
         * 必填: 否
         * 签署方签署顺序，默认1,且不小于1，顺序越小越先处理
         */
        private Integer signOrder;

        /**
         * 必填: 否
         * 签署方账号信息（平台方自动签署时，无需传入该参数）
         */
        private SignerAccount signerAccount;

        /**
         * 必填: 是
         * 签署文件信息
         */
        private List<Signfield> signfields;
        /**
         * 必填: 否
         * 第三方流水号
         */
        private String thirdOrderNo;

        @Data
        public static class SignerAccount {
            /**
             * 必填: 否
             * 签署操作人个人账号标识，即操作本次签署的个人
             * 注：平台用户自动签署时，该参数需要传入签署主体账号id
             */
            private String signerAccountId;
            /**
             * 必填: 否
             * 签约主体账号标识，即本次签署对应任务的归属方，默认是签署操作人个人
             * 注：平台用户自动签署时，无需传入该参数
             */
            private String authorizedAccountId;
        }

        @Data
        public static class Signfield {
            /**
             * 必填: 否
             * 是否自动执行，默认false（如果自动签署，必须设置为true）
             */
            private Boolean autoExecute;
            /**
             * 必填: 否
             * 机构签约类别，当签约主体为机构时必传：2-机构盖章（如果是平台方自动签署，该字段必传，传入2）；
             * 注：
             * 签署主体是个人时，无需传入该参数；
             * 平台用户自动签署时，无需传入该参数
             * 平台方签署时，该字段必传
             */
            private Integer actorIndentityType;
            /**
             * 必填: 是
             * 文件fileId
             */
            private String fileId;
            /**
             * 必填: 否
             * 印章id
             * 需要注意的是：如果开通了实名签，企业签署这种场景不支持指定印章，个人签署场景是支持的
             */
            private String sealId;
            /**
             * 必填: 否
             * 签署方式，个人签署时支持多种签署方式，0-手绘签名  ，1-模板印章签名，多种类型时逗号分割，为空不限制
             */
            private String sealType;
            /**
             * 必填: 否
             * 签署类型，0-不限，1-单页签署，2-骑缝签署，默认1
             */
            private Integer signType;
            /**
             * 必填: 否
             * 签署区位置信息（signType为1时, 页码和XY坐标不能为空, signType为2时, 页码和Y坐标不能为空）
             */
            private PosBean posBean;
            /**
             * 必填: 否
             * 签署区的宽度
             */
            private Integer width;
            /**
             * 必填: 否
             * 是否需要添加签署日期，0-禁止 1-必须 2-不限制，默认0
             */
            private SignDateBeanBean signDateBean;


            @Data
            public static class PosBean {
                /**
                 * 必填: 否
                 * 页码信息，当签署区signType为2时, 页码可以'-'分割指定页码范围, 其他情况只能是数字
                 */
                private String posPage;
                /**
                 * 必填: 否
                 * x坐标
                 */
                private Float posX;
                /**
                 * 必填: 否
                 * y坐标
                 */
                private Float posY;
            }

            @Data
            public static class SignDateBeanBean {
                /**
                 * 必填: 否
                 * 签章日期字体大小
                 */
                private Integer fontSize;
                /**
                 * 必填: 否
                 * 签章日期格式，yyyy年MM月dd日
                 */
                private String format;
                /**
                 * 必填: 否
                 * 页码信息，autoExecute是否自动执行为true时，并且需要展示签署日期，则需要指定日期盖章页码 ，默认当前页
                 */
                private Integer posPage;
                /**
                 * 必填: 否
                 * x坐标 ，autoExecute是否自动执行为true时，并且需要展示签署日期，则需要指定日期盖章位置 ，默认为0
                 */
                private Float posX;

                /**
                 * 必填: 否
                 * y坐标 ，autoExecute是否自动执行为true时，并且需要展示签署日期，则需要指定日期盖章位置 ，默认为0
                 */
                private Float posY;
            }
        }
    }
}
